package com.ives.launcher.logic;

import com.ives.launcher.view.View_Cell;
import com.ives.launcher.view.View_Drag;

import android.view.MotionEvent;
import android.view.View;

/**
 * Interface defining an object that can receive a drag.
 * 定义一个容器，此容器可以发起或接收一个拖动的对象（由DragSource对象发起的一个动作）, 
 * 通常的应用场景为桌面
 */
public interface DragContainer{
	/**
	 * 当拖动进入
	 * 
	 * @param view
	 *            被拖动的cell
	 * @param source
	 *            从哪里拖进来的
	 */
	public void onDragIn(View view, DragContainer source);

	/**
	 * 当自己的cell被拖出去的时候触发
	 * 
	 * @param view
	 * @param target
	 */
	public void onDropOut(View view, DragContainer target);

	/**
	 * 当拖动完成的时候触发
	 * 
	 * @param target
	 * @param success
	 */
	public void onDropCompleted(View target, boolean success);

	/**
	 * 处理拖动过程
	 * 
	 * @param source
	 * @param x
	 * @param y
	 * @param xOffset
	 * @param yOffset
	 * @param dragInfo
	 * @return
	 */
	public boolean disposeDrop(MotionEvent event,View_Drag drag);
	/**
	 * 为移动的cell寻找合适的存放位置
	 * @param touchX 触摸点x
	 * @param touchY 触摸点y
	 * @param drag 拖动过程中的view
	 * @return
	 */
	public int[] findDropCellFinalPosition(int touchX,int touchY,View_Drag drag);
	/**
	 * 检测cell是否可以移动到位置1，如果可以，将cell移动到位置1，如果不可以，强制移动到位置2
	 * 如果移动到位置1成功，则把位置2的位置状态设置成未使用
	 * @param x1 目标位置x
	 * @param y1 目标位置y
	 * @param x2 备用位置x
	 * @param y2 备用位置y
	 * @param drag 移动的drag
	 */
	public boolean moveToPosition(int x1,int y1,View_Drag drag);
	/**
	 * 检查是否可以到该位置
	 * @param x
	 * @param y
	 * @param drag
	 * @return
	 */
	public boolean checkCanMoveToPosition(int x,int y,View_Drag drag);
	/**
	 * 用于将块区域的状态设置成已使用或未使用
	 * @param x 开始x
	 * @param y 开始y
	 * @param w 宽
	 * @param h 高
	 * @param used 状态(true为已使用，false为未使用)
	 */
	public void setPositionStatus(int x,int y,int w,int h,boolean used);
	/**
	 * 移除某个View
	 * @param view
	 */
	public void removeCell (View_Cell cell);
	/**
	 * 根据提供对位置查找该位置是否有item占据
	 * @param x
	 * @param y
	 * @return 没有就返回null
	 */
	public View getChildByPosition(int x,int y);
}
